using System;

namespace SmartBoard.Core.Command
{
    //public class Command<T>:ICommand<T>, ICommand, IDataMaker<T>
    //{
    //    private bool _canExecute = true;
    //    private readonly Func<T, object> _onExecuteCallback;
    //    private readonly Func<T, bool> _onCanExecuteCallback;


    //    public Command(Func<T, object> onExecute)
    //    {
    //        _onExecuteCallback = onExecute;
    //    }

    //    public Command(Func<T, object> onExecute, Func<T, bool> onCanExecute)
    //        : this(onExecute)
    //    {
    //        _onCanExecuteCallback = onCanExecute;
    //    }

    //    #region Implementation of ICommand

    //    public bool CanExecute
    //    {
    //        get { return _canExecute; }
    //        set
    //        {
    //            if (_canExecute == value)
    //                return;
    //            _canExecute = value;
    //            OnCanExecuteChanged();
    //        }
    //    }

    //    #endregion

    //    #region Implementation of ICommand<T>

    //    public void Execute(T parameter)
    //    {
    //        _onExecuteCallback(parameter);
    //    }

    //    public bool RaiseCanExecute(T parameter)
    //    {
    //        var canExecute = true;

    //        if (this._onCanExecuteCallback != null)
    //        {
    //            canExecute = _onCanExecuteCallback(parameter);
    //        }

    //        CanExecute = canExecute;
    //        return canExecute;
    //    }

    //    #endregion

    //    #region ICommand Members

    //    bool ICommand.CanExecute
    //    {
    //        get { return this.CanExecute; }
    //    }

    //    void ICommand.Execute(object parameter)
    //    {
    //        this.Execute((T) parameter);
    //    }

    //    bool ICommand.RaiseCanExecute(object parameter)
    //    {
    //        return this.RaiseCanExecute((T) parameter);
    //    }
    //    #endregion

    //    protected virtual void OnCanExecuteChanged()
    //    { }

    //    #region Implementation of IDataMaker<T>

    //    private Func<T> _prepareDataCallback;

    //    public void SetPrepareDataCallback(Func<T> callback)
    //    {
    //        _prepareDataCallback = callback;
    //    }

    //    public T PrepareData()
    //    {
    //        return _prepareDataCallback();
    //    }

    //    #endregion
    //}
}